#!/bin/bash

# 脚本名称: auto_ssh_key.sh
# 功能: 读取/etc/hosts文件中的IP地址，创建SSH密钥并分发到这些主机
# 注意: 会排除本机IP地址

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 无颜色

# 获取本机IP地址
get_local_ips() {
    # 获取所有非回环地址的IP
    local ips=$(hostname -I 2>/dev/null | tr ' ' '\n')
    if [ -z "$ips" ]; then
        # 如果hostname -I不可用，使用ifconfig
        ips=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')
    fi
    echo "$ips"
}

# 检查并创建SSH密钥
create_ssh_key() {
    local key_path="$HOME/.ssh/id_rsa"
    
    if [[ -f "$key_path" ]]; then
        echo -e "${YELLOW}SSH密钥已存在，跳过创建${NC}"
        return 0
    fi
    
    echo -e "${YELLOW}创建新的SSH密钥对...${NC}"
    # 使用变量而不是硬编码路径，添加密钥长度和静默模式
    ssh-keygen -t rsa -b 4096 -f "$key_path" -N "" -q
    if [[ $? -eq 0 ]]; then
        echo -e "${GREEN}SSH密钥创建成功${NC}"
        return 0
    else
        echo -e "${RED}SSH密钥创建失败${NC}"
        return 1
    fi
}

# 分发公钥到远程主机
distribute_key() {
    local host="$1"
    local user="root"  # 修正：直接定义变量，而不是使用未定义的变量
    local password="root"
    local port="22"    # 添加端口变量，虽然默认是22，但明确指定更好
    
    echo -e "尝试分发密钥到 ${YELLOW}$host${NC}..."
    
    # 尝试使用sshpass分发密钥
    echo -e "尝试使用sshpass分发密钥到 ${YELLOW}$user@$host:$port${NC}..."
    
    # 修正sshpass命令的语法
    # sshpass的正确用法是: sshpass -p [password] command
    sshpass -p "$password" ssh-copy-id -o ConnectTimeout=5 -o StrictHostKeyChecking=no -p "$port" "$user@$host" 2>/dev/null
    
    if [[ $? -eq 0 ]]; then
       echo -e "${GREEN}成功: 密钥已分发到 $host${NC}\n\n"
       return 0
    else
       echo -e "${RED}失败: 无法分发密钥到 $host${NC}\n\n"
       return 1
    fi
}

yum_sshpass() { 

    if ! command -v sshpass >/dev/null 2>&1; then
    echo -e "${YELLOW}未找到sshpass，尝试自动安装...${NC}"
    
        # 检测包管理器并安装sshpass
        if command -v apt-get >/dev/null 2>&1; then
            # Debian/Ubuntu系统
            apt-get update && sudo apt-get install -y sshpass
        elif command -v yum >/dev/null 2>&1; then
            # CentOS/RHEL系统
            yum install -y sshpass
        else
            echo -e "${RED}错误: 无法自动安装sshpass，请手动安装${NC}"
            echo "请根据您的系统选择安装命令:"
            echo "  Debian/Ubuntu: apt-get install sshpass"
            echo "  CentOS/RHEL: yum install sshpass"
            return 1
        fi
    
        # 再次检查是否安装成功
        if ! command -v sshpass >/dev/null 2>&1; then
            echo -e "${RED}错误: sshpass安装失败${NC}"
            return 1
        else
            echo -e "${GREEN}sshpass安装成功${NC}"
        fi
    fi

 }




# 主函数
main() {

    yum_sshpass


    local hosts_file="/etc/hosts"
    local success_count=0
    local fail_count=0
    
    # 检查hosts文件是否存在
    if [[ ! -f "$hosts_file" ]]; then
        echo -e "${RED}错误: 找不到hosts文件 '$hosts_file'${NC}"
        exit 1
    fi
    
    # 获取本机IP地址
    echo -e "${YELLOW}获取本机IP地址...${NC}"
    local local_ips=($(get_local_ips))
    echo -e "本机IP地址: ${GREEN}${local_ips[*]}${NC}"
    
    # 创建SSH密钥
    create_ssh_key || exit 1
    
    # 读取hosts文件并分发密钥
    echo -e "${YELLOW}开始处理/etc/hosts文件中的IP地址...${NC}"
    
    # 从/etc/hosts中提取IP地址
    while IFS= read -r line; do
        # 跳过空行、注释行和回环地址
        [[ -z "$line" || "$line" =~ ^# || "$line" =~ 127.0.0.1 || "$line" =~ ::1 ]] && continue
        
        # 提取IP地址（第一个字段）
        ip=$(echo "$line" | awk '{print $1}')
        
        # 验证IP地址格式
        if [[ ! $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            continue
        fi
        
        # 跳过本机IP
        if printf '%s\n' "${local_ips[@]}" | grep -qx "$ip"; then
            echo -e "${YELLOW}跳过本机IP: $ip${NC}"
            continue
        fi
        
        # 分发密钥
        if distribute_key "$ip"; then
            ((success_count++))
        else
            ((fail_count++))
        fi
        
    done < "$hosts_file"
    
    # 输出总结
    echo -e "\n${YELLOW}===== 操作总结 =====${NC}"
    echo -e "${GREEN}成功: $success_count${NC} 个主机"
    echo -e "${RED}失败: $fail_count${NC} 个主机"
    
    if [[ $fail_count -eq 0 ]]; then
        echo -e "${GREEN}所有密钥分发操作成功完成!${NC}"
    else
        echo -e "${YELLOW}部分密钥分发失败，请检查网络连接和主机可用性${NC}"
    fi
}

# 执行主函数
main 
